多次元分割表

データ例

data(birthwt,package="MASS")
head(birthwt)
##    low age lwt race smoke ptl ht ui ftv  bwt
## 85   0  19 182    2     0   0  0  1   0 2523
## 86   0  33 155    3     0   0  0  0   3 2551
## 87   0  20 105    1     1   0  0  0   1 2557
## 88   0  21 108    1     1   0  0  1   2 2594
## 89   0  18 107    1     1   0  0  1   0 2600
## 91   0  21 124    3     0   0  0  0   0 2622

xtabs関数で多次元分割表

xtabs関数でモデル式で多次元分割表を作成できる。
モデル式を~ x1 + x2 + ...とすることで、右辺の変数に関する多次元分割表に基づく度数を集計する。

n <- xtabs(~smoke+race+low,birthwt)
n
## , , low = 0
## 
##      race
## smoke  1  2  3
##     0 40 11 35
##     1 33  4  7
## 
## , , low = 1
## 
##      race
## smoke  1  2  3
##     0  4  5 20
##     1 19  6  5

モデル式をy ~ x1 + x2 + ...とすることで、右辺の変数に関する多次元分割表に基づく左辺の変数の合計を集計する。

sum <- xtabs(bwt~smoke+race+low,birthwt)
sum
## , , low = 0
## 
##      race
## smoke      1      2      3
##     0 143309  34923 113721
##     1 105397  12354  23080
## 
## , , low = 1
## 
##      race
## smoke      1      2      3
##     0   7556  10749  41147
##     1  41599  12686  10006

これらを組み合わせれば、平均値も計算できる

m <- sum/n
m
## , , low = 0
## 
##      race
## smoke        1        2        3
##     0 3582.725 3174.818 3249.171
##     1 3193.848 3088.500 3297.143
## 
## , , low = 1
## 
##      race
## smoke        1        2        3
##     0 1889.000 2149.800 2057.350
##     1 2189.421 2114.333 2001.200

ftable関数で多次元分割表→ピボットテーブル

多次元分割表は複数のクロス集計表として表示される。
ftable関数でピボットテーブルのような入れ子状の表に変換される。

ftable(m)
##            low        0        1
## smoke race                      
## 0     1        3582.725 1889.000
##       2        3174.818 2149.800
##       3        3249.171 2057.350
## 1     1        3193.848 2189.421
##       2        3088.500 2114.333
##       3        3297.143 2001.200

table属性の表の行名row.varsと列名col.varsを指定することから作成することもできる。

ftable(Titanic,row.vars=c("Class","Sex"),col.vars="Survived")
##              Survived  No Yes
## Class Sex                    
## 1st   Male            118  62
##       Female            4 141
## 2nd   Male            154  25
##       Female           13  93
## 3rd   Male            422  88
##       Female          106  90
## Crew  Male            670 192
##       Female            3  20